import tkinter.ttk as tk
import csv
from tkinter import *
from tkinter import messagebox
from controller import controller

#主界面
class maininterface:
    def index(self):
        global con
        global tree
        global a
        global b
        global c
        global d
        global e
        global f
        global g
        global h
        global i
        global j
        global k
        global l
        global u
        root = Tk()  # 通过Tk的无参构造函数创建应用程序主窗口
        root.title("学生成绩管理系统")  # 设置左上角的窗口标题
        root.geometry('1000x550')  # 使用geometry自定义设置窗口尺寸
        root.resizable(width=False, height=False)  # 设置窗口为不可更改 固定窗口
        # tkinter默认支持的是gif
        photo = PhotoImage(file="./img/img.gif")
        #图片应用设置应用
        Label(root,image=photo).pack()
        # Tkinter标签控件（Label）用法：https://www.runoob.com/python/python-tk-label.html
        # 用法：w = Label ( master, option, ... )
        # master: 框架的父容器 此处是root
        # options: 该标签的可设置的属性，以逗号分隔。
        # text 设置文本，可以包含换行转义字符
        # bg 标签背景颜色
        # 设置前景色
        # font 设置字体
        # w.pack() 调用pack方法，调整其显示位置和大小，pack是按添加顺序排列组件
        # side 定义停靠在父组件的哪一边上 “ top ” , “ bottom ” , “left”, “right” （默认为”top”）
        # fill 填充 x(y)方向上的空间，当属性 side=”top”或” bottom”时，填充 x 方向
        # Python Tkinter Place布局管理器用法：https://www.cnblogs.com/jsdd/articles/11482023.html
        # x：指定组件的 X 坐标。x 为 0 代表位于最左边。  y：指定组件的 Y 坐标。y 为 0 代表位于最右边。
        Label(root, text='学生成绩管理系统', bg='white', fg='red', font=('宋体', 15)).place(x=430,y=10)
        Label(root, text="学号查询" ).place(x=360, y=100)
        con = controller()  # 创建控制器对象
        data = con.cha('')  # 获取首次全部数据,即首次启动系统显示的数据

        u = StringVar()
        # 通过textvariable来获取框中值
        # Tkinter 组件：Entry，Entry（输入框）组件通常用于获取用户的输入文本。
        Entry(root, width=20, textvariable=u).place(x=420, y=100)
        # Button 控件是一种标准 Tkinter 控件, 用来展现不同样式的按钮.
        # Button 控件被用以和用户交互, 比如按钮被鼠标点击后, 某种操作被启动.
        # 和 Label 控件类似, 按钮可以展示图片或者文字.
        # 不同的是, Label 控件可以指定字体, Button 控件只能使用单一的字体. Button 上的文字可以多行显示.
        # command类型：回调；
        # 说明：当按钮被按下时所调用的一个函数或方法。所回调的可以是一个函数、方法或别的可调用的Python对象。
        Button(root, text="查询", width=8, command=search).place(x=575, y=95)
        Button(root, text="成绩排名", width=9, height=4, command=paiMing).place(x=715, y=440)
        Button(root, text="生成报表", width=9, height=4, command=baobiao).place(x=800, y=440)
        # Python tkinter之Treeview用法：https://www.cnblogs.com/rainbow-tan/p/14125768.html
        # 设置列表中列的布局，root是父容器，columns定义显示的列，show='headings'用于隐藏首列
        tree = tk.Treeview(root, height=13, columns=['1', '2', '3', '4', '5', '6', '7'], show='headings')
        tree.place(x=360, y=140)  # 定义位置
        # anchor='w' 定义对齐方式，可选n, ne, e, se, s, sw, w, nw, center
        tree.column('1', width=85, anchor='center')
        tree.column('2', width=85, anchor='center')
        tree.column('3', width=85, anchor='center')
        tree.column('4', width=85, anchor='center')
        tree.column('5', width=85, anchor='center')
        tree.column('6', width=85, anchor='center')
        tree.column('7', width=85, anchor='center')
        # 设置列表中列的标题
        tree.heading('1', text='学号')
        tree.heading('2', text='姓名')
        tree.heading('3', text='性别')
        tree.heading('4', text='数学')
        tree.heading('5', text='英语')
        tree.heading('6', text='语文')
        tree.heading('7', text='总成绩')
        for i in range(len(data)):  # 数据输出 页面首次
            tree.insert('', 'end', values=data[i])

        a = IntVar()
        b = StringVar()
        c = StringVar()
        d = IntVar()
        e = IntVar()
        f = IntVar()
        Label(root, text="添加数据").place(x=40, y=100)
        Label(root, text="学号").place(x=40, y=130)
        Entry(root, width=20, textvariable=a).place(x=75, y=130)
        Label(root, text="姓名").place(x=40, y=160)
        Entry(root, width=20, textvariable=b).place(x=75, y=160)
        Label(root, text="性别").place(x=40, y=190)
        Entry(root, width=20, textvariable=c).place(x=75, y=190)
        Label(root, text="数学").place(x=40, y=220)
        Entry(root, width=20, textvariable=d).place(x=75, y=220)
        Label(root, text="英语").place(x=40, y=250)
        Entry(root, width=20, textvariable=e).place(x=75, y=250)
        Label(root, text="语文").place(x=40, y=280)
        Entry(root, width=20, textvariable=f).place(x=75, y=280)
        Button(root, text="添加", width=9, height=4, bg="white", command=zengjia).place(x=250, y=170)
        # 选中的数据显示至输入框
        form_record = []

        g = StringVar()
        h = StringVar()
        i = StringVar()
        j = StringVar()
        k = StringVar()
        l = StringVar()
        Label(root, text="更改数据").place(x=40, y=320)
        Label(root, text="学号").place(x=40, y=350)
        Entry(root, width=20, textvariable=g).place(x=75, y=350)
        Label(root, text="姓名").place(x=40, y=380)
        Entry(root, width=20, textvariable=h).place(x=75, y=380)
        Label(root, text="性别").place(x=40, y=410)
        Entry(root, width=20, textvariable=i).place(x=75, y=410)
        Label(root, text="数学").place(x=40, y=440)
        Entry(root, width=20, textvariable=j).place(x=75, y=440)
        Label(root, text="英语").place(x=40, y=470)
        Entry(root, width=20, textvariable=k).place(x=75, y=470)
        Label(root, text="语文").place(x=40, y=500)
        Entry(root, width=20, textvariable=l).place(x=75, y=500)
        Button(root, text="更新", width=9, height=4, command=gengxin).place(x=250, y=380)
        Button(root, text="删除信息", width=9, height=4, command=shanchu).place(x=885, y=440)
        # mainloop()方法允许程序循环执行，并进入等待和处理事件。
        root.mainloop()

def search():  # 模糊查询
    x = tree.get_children()  # 清空所有页面数据
    for i in x:
        tree.delete(i)
    data = con.cha(u.get())  # 获取数据
    for i in range(len(data)):  # 数据输出
        tree.insert('', 'end', values=data[i])

def paiMing():  # 分数排名
    x = tree.get_children()  # 清空所有页面数据
    for i in x:
        tree.delete(i)
    data = con.pai()
    for i in range(len(data)):  # 数据输出
        tree.insert('', 'end', values=data[i])


def baobiao():
    con.biao()  # 调用生成文件报表方法
    messagebox.showinfo('已完成', '请查看student.csv文件')  # 弹出消息框确认完成
# 在使用界面编程的时候，有些时候是需要跟踪变量的值的变化，以保证值的变更随时可以显示在界面上。
# 由于python无法做到这一点，所以使用了tcl的相应的对象，也就是StringVar、BooleanVar、DoubleVar、IntVar所需要起到的作用
# StringVar类似于Java中的String
# 设定一个空字符串接收输入的值
# 双向绑定



def zengjia():
    s = [a.get(), b.get(), c.get(), d.get(), e.get(), f.get()]  # 写入数据源
    for i in range(6):  # 判断输入是否有空值
        if (s[i] == ''):
            messagebox.showinfo('信息', '信息不完整')
            break
    else:  # python break 无法跳出两层，需用for()....else...来解决
        con.zeng(s)  # 将数据源交于控制器方法传入数据库
        messagebox.showinfo('提示', '添加成功')  # 弹出消息框
        search()  # 再次查询

def show_input():
    global form_record
    print(form_record)
    g.set(form_record[0])
    h.set(form_record[1])
    i.set(form_record[2])
    j.set(form_record[3])
    k.set(form_record[4])
    l.set(form_record[5])

def selectTree(event):  # 表格点击响应函数
    global form_record
    form_record = tree.item(tree.selection(), "values")  # 获得点击的数据
    # 显示至输入框
    show_input()

def gengxin():  # 更新数据
    s = [g.get(), h.get(), i.get(), j.get(), k.get(), l.get()]  # 写入数据源
    con.geng(s)  # 调用更新方法
    messagebox.showinfo('提示','更新成功')  # 弹出消息框
    search()  # 重新加载数据

def shanchu():  # 删除数据
    form_record = tree.item(tree.selection(), "values")  # 获得点击的数据
    n = form_record[0] #获得选择的学号
    if (n == ''):
       messagebox.showinfo('提示', '请选中学生')
    else:
        con.shan(n)  # 调用删除方法
        messagebox.showinfo('提示', '删除成功')  # 弹出消息框
        search()  # 重新加载数据

#
# interface = maininterface()
# interface.index()



